/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

var Product = {};

Product.Gallery = Class.create();
Product.Gallery.prototype = {
    images: [],
    file2id: {'no_selection':0},
    idIncrement: 1,
    containerId: '',
    container: null,
    uploader: null,
    imageTypes: {},
    initialize: function (containerId, uploader, imageTypes) {
        this.containerId  = containerId,
        this.container = $(this.containerId);
        this.uploader = uploader;
        this.imageTypes = imageTypes;
        if (this.uploader) {
            this.uploader.onFilesComplete = this.handleUploadComplete.bind(this);
        }
        //this.uploader.onFileProgress  = this.handleUploadProgress.bind(this);
        //this.uploader.onFileError     = this.handleUploadError.bind(this);
        this.images = this.getElement('save').value.evalJSON();
        this.imagesValues = this.getElement('save_image').value.evalJSON();
        this.template = new Template('<tr id="__id__" class="preview">' + this.getElement('template').innerHTML + '</tr>', new RegExp('(^|.|\\r|\\n)(__([a-zA-Z0-9_]+)__)', ''));
        this.fixParentTable();
        this.updateImages();
        varienGlobalEvents.attachEventHandler('moveTab', this.onImageTabMove.bind(this));
    },
    onImageTabMove: function(event) {
        var imagesTab = false;
        this.container.ancestors().each(function(parentItem){
            if (parentItem.tabObject) {
                imagesTab = parentItem.tabObject;
                throw $break;
            }
        }.bind(this));
        if(imagesTab && event.tab && event.tab.name && imagesTab.name == event.tab.name) {
            this.updateImages();
        }
    },
    fixParentTable: function() {
        this.container.ancestors().each(function(parentItem){
            if(parentItem.tagName.toLowerCase()=='td') {
                parentItem.style.width ='100%';
            }
            if(parentItem.tagName.toLowerCase()=='table') {
                parentItem.style.width ='100%';
                throw $break;
            }
        });
    },
    getElement:           function (name) {
        return $(this.containerId + '_' + name);
    },
    showUploader:         function () {
        this.getElement('add_images_button').hide();
        this.getElement('uploader').show();
    },
    handleUploadComplete: function (files) {
        files.each(function(item) {
           if (!item.response.isJSON()) {
                try {
                    console.log(item.response);
                } catch (e2) {
                    alert(item.response);
                }
               return;
           }
           var response = item.response.evalJSON();
           if (response.error) {
               return;
           }
           var newImage = {};
           newImage.url = response.url;
           newImage.file = response.file;
           newImage.label = '';
           newImage.position = this.getNextPosition();
           newImage.disabled = 0;
           newImage.removed = 0;
           this.images.push(newImage);
           this.uploader.removeFile(item.id);
        }.bind(this));
        this.container.setHasChanges();
        this.updateImages();
    },
    updateImages: function() {
        this.getElement('save').value = this.images.toJSON();
        $H(this.imageTypes).each(function(pair) {
           this.getFileElement('no_selection', 'cell-' + pair.key + ' input').checked = true;
        }.bind(this));
        this.images.each(function(row){
            if (!$(this.prepareId(row.file))) {
                this.createImageRow(row);
            }
            this.updateVisualisation(row.file);
        }.bind(this));
        this.updateUseDefault(false);
    },
    createImageRow: function(image) {
        var vars = Object.clone(image);
        vars.id = this.prepareId(image.file);
        var html = this.template.evaluate(vars);
        Element.insert(this.getElement('list'), {bottom: html});
    },
    prepareId: function(file) {
        if(typeof this.file2id[file] == 'undefined') {
            this.file2id[file] = this.idIncrement++;
        }
        return this.containerId + '-image-' + this.file2id[file];
    },
    getNextPosition: function() {
      var maxPosition = 0;
      this.images.each(function (item) {
         if (parseInt(item.position) > maxPosition) {
             maxPosition = parseInt(item.position);
         }
      });
      return maxPosition + 1;
    },
    updateImage: function(file) {
      var index = this.getIndexByFile(file);
      this.images[index].label = this.getFileElement(file, 'cell-label input').value;
      this.images[index].position = this.getFileElement(file, 'cell-position input').value;
      this.images[index].removed = (this.getFileElement(file, 'cell-remove input').checked ? 1 : 0);
      this.images[index].disabled = (this.getFileElement(file, 'cell-disable input').checked ? 1 : 0);
      this.getElement('save').value = this.images.toJSON();
      this.updateState(file);
      this.container.setHasChanges();
    },
    loadImage: function(file) {
      var image = this.getImageByFile(file);
      this.getFileElement(file, 'cell-image img').src = image.url;
      this.getFileElement(file, 'cell-image img').show();
      this.getFileElement(file, 'cell-image .place-holder').hide();
    },
    setProductImages: function(file) {
      $H(this.imageTypes).each(function(pair){
          if(this.getFileElement(file, 'cell-' + pair.key + ' input').checked) {
              this.imagesValues[pair.key] = (file == 'no_selection' ? null : file);
          }
      }.bind(this));

      this.getElement('save_image').value = $H(this.imagesValues).toJSON();
    },
    updateVisualisation: function(file) {
      var image = this.getImageByFile(file);
      this.getFileElement(file, 'cell-label input').value = image.label;
      this.getFileElement(file, 'cell-position input').value = image.position;
      this.getFileElement(file, 'cell-remove input').checked = (image.removed == 1);
      this.getFileElement(file, 'cell-disable input').checked = (image.disabled == 1);
      $H(this.imageTypes).each(function(pair) {
          if(this.imagesValues[pair.key] == file) {
              this.getFileElement(file, 'cell-' + pair.key + ' input').checked = true;
          }
      }.bind(this));
      this.updateState(file);
    },
    updateState: function (file) {
      if(this.getFileElement(file, 'cell-disable input').checked) {
          this.getFileElement(file, 'cell-position input').disabled = true;
      } else {
          this.getFileElement(file, 'cell-position input').disabled = false;
      }
    },
    getFileElement: function(file, element){
        var selector = '#' + this.prepareId(file) + ' .' + element;
        var elems = $$(selector);
        if(!elems[0]) {
            try {
                console.log(selector);
            } catch (e2) {
                alert(selector);
            }
        }

       return $$('#' + this.prepareId(file) + ' .' + element)[0];
    },
    getImageByFile: function(file) {
      if (this.getIndexByFile(file)===null) {
          return false;
      }

      return this.images[this.getIndexByFile(file)];
    },
    getIndexByFile: function(file) {
          var index;
          this.images.each(function (item, i) {
             if (item.file == file) {
                 index = i;
             }
          });
          return index;
    },
    updateUseDefault: function ()
    {
      if (this.getElement('default')) {
         this.getElement('default').select('input').each(function(input){
             $(this.containerId).select('.cell-' + input.value + ' input').each(function(radio) {
                 radio.disabled = input.checked;
             });
         }.bind(this));
      }

      if (arguments.length == 0) {
          this.container.setHasChanges();
      }
    },
    handleUploadProgress: function (file) {

    },
    handleUploadError:    function (fileId) {

    }
};

Product.AttributesBridge = {
    tabsObject: false,
    bindTabs2Attributes: {},
    bind: function(tabId, attributesObject) {
        this.bindTabs2Attributes[tabId] = attributesObject;
    },
    getAttributes: function(tabId) {
        return this.bindTabs2Attributes[tabId];
    },
    setTabsObject: function(tabs) {
        this.tabsObject = tabs;
    },
    getTabsObject: function() {
        return this.tabsObject;
    },
    addAttributeRow: function(data)
    {
        $H(data).each(function(item){
            if(this.getTabsObject().activeTab.name!=item.key) {
                this.getTabsObject().showTabContent($(item.key));
            }
            this.getAttributes(item.key).addRow(item.value);
        }.bind(this));
    }
};

Product.Attributes = Class.create();
Product.Attributes.prototype = {
    config: {},
    containerId: null,
    initialize: function(containerId) {
        this.containerId = containerId;
    },
    setConfig: function(config) {
        this.config = config;
        Product.AttributesBridge.bind(this.getConfig().tab_id, this);
    },
    getConfig: function () {
        return this.config;
    },
    create: function () {
        var win = window.open(this.getConfig().url, 'new_attribute', 'width=900,height=600,resizable=1,scrollbars=1');
        win.focus();
    },
    addRow: function(html) {
        var attributesContainer = $$('#group_fields' + this.getConfig().group_id + ' .form-list tbody')[0];
        Element.insert(attributesContainer, {bottom: html});

        var childs = attributesContainer.childElements();
        var element = childs[childs.size()-1].select('input','select','textarea')[0];
        if (element) {
            window.scrollTo(0, Position.cumulativeOffset(element)[1] + element.offsetHeight);
        }
    }
};

Product.Configurable = Class.create();
Product.Configurable.prototype = {
	initialize: function (attributes, links, idPrefix, grid, readonly) {
		this.templatesSyntax = new RegExp('(^|.|\\r|\\n)(\'{{\\s*(\\w+)\\s*}}\')', "");
	    this.attributes = attributes; // Attributes
		this.idPrefix   = idPrefix;   // Container id prefix
		this.links 		= $H(links);  // Associated products
		this.newProducts = [];        // For product that's created througth Create Empty and Copy from Configurable
        this.readonly = readonly;
        
		/* Generation templates */
		this.addAttributeTemplate     = new Template($(idPrefix + 'attribute_template').innerHTML.replace(/__id__/g,"'{{html_id}}'").replace(/ template no-display/g,''), this.templatesSyntax);
		this.addValueTemplate         = new Template($(idPrefix + 'value_template').innerHTML.replace(/__id__/g,"'{{html_id}}'").replace(/ template no-display/g,''), this.templatesSyntax);
		this.pricingValueTemplate     = new Template($(idPrefix + 'simple_pricing').innerHTML, this.templatesSyntax);
		this.pricingValueViewTemplate = new Template($(idPrefix + 'simple_pricing_view').innerHTML, this.templatesSyntax);

		this.container            = $(idPrefix + 'attributes');

		/* Listeners */
		this.onLabelUpdate        = this.updateLabel.bindAsEventListener(this);       // Update attribute label
		this.onValuePriceUpdate   = this.updateValuePrice.bindAsEventListener(this);  // Update pricing value
		this.onValueTypeUpdate    = this.updateValueType.bindAsEventListener(this);   // Update pricing type
		this.onValueDefaultUpdate = this.updateValueUseDefault.bindAsEventListener(this);

		/* Grid initialization and attributes initialization */
		this.createAttributes(); // Creation of default attributes

		this.grid = grid;
		this.grid.rowClickCallback        = this.rowClick.bind(this);
		this.grid.initRowCallback         = this.rowInit.bind(this);
		this.grid.checkboxCheckCallback   = this.registerProduct.bind(this); // Associate/Unassociate simple product

		this.grid.rows.each(function(row) {
			this.rowInit(this.grid, row);
		}.bind(this));
	},
	createAttributes: function() {
	    this.attributes.each(function(attribute, index) {
	        //var li = Builder.node('li', {className:'attribute'});
	        var li = $(document.createElement('LI'));
	        li.className = 'attribute';
			li.id = this.idPrefix + '_attribute_' + index;
			attribute.html_id = li.id;
			if(attribute && attribute.label && attribute.label.blank()) {
				attribute.label = '&nbsp;'
			}
			li.update(this.addAttributeTemplate.evaluate(attribute));
			li.attributeObject = attribute;

			this.container.appendChild(li);
			li.attributeValues = li.down('.attribute-values');

			if (attribute.values) {
    			attribute.values.each(function(value){
    				this.createValueRow(li, value); // Add pricing values
    			}.bind(this));
			}

			/* Observe label change */
			Event.observe(li.down('.attribute-label'),'change', this.onLabelUpdate);
			Event.observe(li.down('.attribute-label'),'keyup',  this.onLabelUpdate);
		}.bind(this));
		if (!this.readonly) {
		    // Creation of sortable for attributes sorting
		    Sortable.create(this.container, {handle:'attribute-name-container',onUpdate:this.updatePositions.bind(this)});
		}
		this.updateSaveInput();
	},

	updateLabel: function (event) {
		var li = Event.findElement(event, 'LI');
		li.attributeObject.label = Event.element(event).value;
		this.updateSaveInput();
	},
	updatePositions: function(param) {
		this.container.childElements().each(function(row, index) {
			row.attributeObject.position = index;
		});
		this.updateSaveInput();
	},
	addNewProduct: function(productId, attributes) {
	    if (this.checkAttributes(attributes)) {
	        this.links.set(productId, this.cloneAttributes(attributes));
	    } else {
	        this.newProducts.push(productId);
	    }

        this.updateGrid();
	    this.updateValues();
	    this.grid.reload(null);
	},
	createEmptyProduct: function() {
	    this.createPopup(this.createEmptyUrl)
	},
	createNewProduct: function() {
	    this.createPopup(this.createNormalUrl);
	},
	createPopup: function(url) {
	    if (this.win && !this.win.closed) {
	        this.win.close();
	    }

	    this.win = window.open(url, '','width=1000,height=700,resizable=1,scrollbars=1');
	    this.win.focus();
	},
	registerProduct: function(grid, element, checked) {
		if(checked){
            if(element.linkAttributes) {
            	this.links.set(element.value, element.linkAttributes);
            }
        }
        else{
            this.links.unset(element.value);
        }
        this.updateGrid();
        this.grid.rows.each(function(row) {
			this.revalidateRow(this.grid, row);
		}.bind(this));
		this.updateValues();
	},
	updateProduct: function(productId, attributes) {
	    var isAssociated = false;

	    if (typeof this.links.get(productId) != 'undefined') {
	        isAssociated = true;
	        this.links.unset(productId);
	    }

	    if (isAssociated && this.checkAttributes(attributes)) {
	        this.links.set(productId, this.cloneAttributes(attributes));
	    } else if (isAssociated) {
	        this.newProducts.push(productId);
	    }

	    this.updateGrid();
	    this.updateValues();
	    this.grid.reload(null);
	},
	cloneAttributes: function (attributes) {
	    var newObj = [];
	    for (var i=0, length=attributes.length; i<length; i++) {
	        newObj[i] = Object.clone(attributes[i]);
	    }
	    return newObj;
	},
	rowClick: function(grid, event) {
		var trElement = Event.findElement(event, 'tr');
        var isInput   = Event.element(event).tagName.toUpperCase() == 'INPUT';

        if ($(Event.findElement(event, 'td')).down('a')) {
            return;
        }

        if(trElement){
            var checkbox = $(trElement).down('input');
            if(checkbox && !checkbox.disabled){
                var checked = isInput ? checkbox.checked : !checkbox.checked;
                grid.setCheckboxChecked(checkbox, checked);
            }
        }
	},
	rowInit: 		 function(grid, row) {
		var checkbox = $(row).down('.checkbox');
		var input = $(row).down('.value-json');

		if(checkbox && input) {
			checkbox.linkAttributes = input.value.evalJSON();
			if(!checkbox.checked) {
				if(!this.checkAttributes(checkbox.linkAttributes)) {
					$(row).addClassName('invalid');
					checkbox.disable();
				} else {
					$(row).removeClassName('invalid');
					checkbox.enable();
				}
			}
		}
	},
	revalidateRow: function(grid, row) {
		var checkbox = $(row).down('.checkbox');
		if(checkbox ) {
			if(!checkbox.checked) {
				if(!this.checkAttributes(checkbox.linkAttributes)) {
					$(row).addClassName('invalid');
					checkbox.disable();
				} else {
					$(row).removeClassName('invalid');
					checkbox.enable();
				}
			}
		}
	},
	checkAttributes:	function(attributes) {
		var result = true;
		this.links.each(function(pair) {
			var fail = false;
			for(var i = 0; i < pair.value.length && !fail; i++) {
				for(var j = 0; j < attributes.length && !fail; j ++) {
					if(pair.value[i].attribute_id == attributes[j].attribute_id && pair.value[i].value_index != attributes[j].value_index) {
						fail = true;
					}
				}
			}
			if(!fail) {
				result = false;
			}
		});
		return result;
	},
	updateGrid: function () {
		this.grid.reloadParams = {'products[]':this.links.keys().size() ? this.links.keys() : [0], 'new_products[]':this.newProducts};
	},
	updateValues: function () {
		var uniqueAttributeValues = $H({});
		/* Collect unique attributes */
		this.links.each(function(pair) {
			for (var i = 0, length=pair.value.length; i < length; i ++) {
				var attribute = pair.value[i];
				if (uniqueAttributeValues.keys().indexOf(attribute.attribute_id) == -1) {
					uniqueAttributeValues.set(attribute.attribute_id, $H({}));
				}
				uniqueAttributeValues.get(attribute.attribute_id).set(attribute.value_index, attribute);
			}
		});
		/* Updating attributes value container */
		this.container.childElements().each(function(row) {
			var attribute = row.attributeObject;
			for (var i = 0, length=attribute.values.length; i < length; i ++) {
				if (uniqueAttributeValues.keys().indexOf(attribute.attribute_id) == -1
					|| uniqueAttributeValues.get(attribute.attribute_id).keys().indexOf(attribute.values[i].value_index)==-1) {
					row.attributeValues.childElements().each(function(elem) {
						if (elem.valueObject.value_index==attribute.values[i].value_index) {
							elem.remove();
						}
					});
					attribute.values[i] = undefined;

				} else {
					uniqueAttributeValues.get(attribute.attribute_id).unset(attribute.values[i].value_index);
				}
			}
			attribute.values = attribute.values.compact();
			if (uniqueAttributeValues.get(attribute.attribute_id)) {
				uniqueAttributeValues.get(attribute.attribute_id).each(function(pair) {
					attribute.values.push(pair.value);
					this.createValueRow(row, pair.value);
				}.bind(this));
			}
		}.bind(this));
		this.updateSaveInput();
		this.updateSimpleForm();
	},
	createValueRow: function(container, value) {
		var templateVariables = $H({});
		if(!this.valueAutoIndex) {
			this.valueAutoIndex = 1;
		}
		templateVariables.set('html_id', container.id  + '_' + this.valueAutoIndex);
		templateVariables = templateVariables.merge(value);
		var pricingValue = parseFloat(templateVariables.get('pricing_value'));
		if (!isNaN(pricingValue)) {
		    templateVariables.set('pricing_value', pricingValue);
		} else  {
		    templateVariables.unset('pricing_value');
		}
		this.valueAutoIndex++;

		//var li = $(Builder.node('li', {className:'attribute-value'}));
		var li = $(document.createElement('LI'));
		li.className = 'attribute-value';
		li.id = templateVariables.get('html_id');
		li.update(this.addValueTemplate.evaluate(templateVariables));
		li.valueObject = value;
		if (typeof li.valueObject.is_percent == 'undefined') {
			li.valueObject.is_percent = 0;
		}

		if (typeof li.valueObject.pricing_value == 'undefined') {
			li.valueObject.pricing_value = '';
		}

		container.attributeValues.appendChild(li);
		var priceField = li.down('.attribute-price');
		var priceTypeField = li.down('.attribute-price-type');

		if(parseInt(value.is_percent)) {
			priceTypeField.options[1].selected = !(priceTypeField.options[0].selected = false);
		} else {
			priceTypeField.options[1].selected = !(priceTypeField.options[0].selected = true);
		}
		Event.observe(priceField, 'keyup', this.onValuePriceUpdate);
		Event.observe(priceField, 'change', this.onValuePriceUpdate);
		Event.observe(priceTypeField, 'change', this.onValueTypeUpdate);
		var useDefaultEl = li.down('.attribute-use-default-value');
		if (useDefaultEl) {
		    if (li.valueObject.use_default_value) {
		        useDefaultEl.checked = true;
		        this.updateUseDefaultRow(useDefaultEl, li);
		    }
		    Event.observe(useDefaultEl, 'change', this.onValueDefaultUpdate);
		}
	},
	updateValuePrice: function(event) {
		var li = Event.findElement(event, 'LI');
		li.valueObject.pricing_value = (Event.element(event).value.blank() ? null : Event.element(event).value);
		this.updateSimpleForm();
		this.updateSaveInput();
	},
	updateValueType:  function(event) {
		var li = Event.findElement(event, 'LI');
		li.valueObject.is_percent = (Event.element(event).value.blank() ? null : Event.element(event).value);
		this.updateSimpleForm();
		this.updateSaveInput();
	},
    updateValueUseDefault: function(event) {
        var li = Event.findElement(event, 'LI');
        var useDefaultEl = Event.element(event);
        li.valueObject.use_default_value = useDefaultEl.checked;
        this.updateUseDefaultRow(useDefaultEl, li);
    },
    updateUseDefaultRow: function(useDefaultEl, li)
    {
        var priceField = li.down('.attribute-price');
        var priceTypeField = li.down('.attribute-price-type');
        if (useDefaultEl.checked) {
            priceField.disabled = true;
            priceTypeField.disabled = true;
        }
        else {
            priceField.disabled = false;
            priceTypeField.disabled = false;
        }
        this.updateSimpleForm();
        this.updateSaveInput();
    },
	updateSaveInput: function() {
		$(this.idPrefix + 'save_attributes').value = this.attributes.toJSON();
		$(this.idPrefix + 'save_links').value  = this.links.toJSON();
	},
	initializeAdvicesForSimpleForm: function() {
	    if ($(this.idPrefix + 'simple_form').advicesInited) {
	        return;
	    }

	    $(this.idPrefix + 'simple_form').select('td.value').each(function (td) {
            var adviceContainer = $(Builder.node('div'));
            td.appendChild(adviceContainer);
	        td.select('input', 'select').each(function(element){
	            element.advaiceContainer = adviceContainer;
	        });
	    });
	    $(this.idPrefix + 'simple_form').advicesInited = true;
	},
	quickCreateNewProduct: function() {
        this.initializeAdvicesForSimpleForm();
	    $(this.idPrefix + 'simple_form').removeClassName('ignore-validate');
	    var validationResult = $(this.idPrefix + 'simple_form').select('input','select','textarea').collect(
	       function(elm) {
	            return Validation.validate(elm,{useTitle : false, onElementValidate : function(){}});
	       }
	    ).all();
	    $(this.idPrefix + 'simple_form').addClassName('ignore-validate');

	    if (!validationResult) {
	        return;
	    }

	    var params = Form.serializeElements(
	       $(this.idPrefix + 'simple_form').select('input','select','textarea'),
	       true
	    );
	    params.form_key = FORM_KEY;
	    $('messages').update();
	    new Ajax.Request(this.createQuickUrl, {
	           parameters: params,
	           method:'post',
	           area: $(this.idPrefix + 'simple_form'),
	           onComplete: this.quickCreateNewProductComplete.bind(this)
	    });
	},
	quickCreateNewProductComplete: function (transport) {
	    var result = transport.responseText.evalJSON();

	    if (result.error) {
	        if (result.error.fields) {
	            $(this.idPrefix + 'simple_form').removeClassName('ignore-validate');
	            $H(result.error.fields).each(function(pair){
	                $('simple_product_' + pair.key).value = pair.value;
	                $('simple_product_' + pair.key + '_autogenerate').checked = false;
	                toggleValueElements(
	                   $('simple_product_' + pair.key + '_autogenerate'),
	                   $('simple_product_' + pair.key + '_autogenerate').parentNode
	                );
	                Validation.ajaxError($('simple_product_' + pair.key), result.error.message);
	            });
	            $(this.idPrefix + 'simple_form').addClassName('ignore-validate');
	        } else {
	            if (result.error.message) {
	                alert(result.error.message);
	            }
	            else {
	                alert(result.error);
	            }
	        }
	        return;
	    } else if(result.messages) {
	        $('messages').update(result.messages);
	    }


	    result.attributes.each(function(attribute) {
	        var attr = this.getAttributeById(attribute.attribute_id);
	        if (!this.getValueByIndex(attr, attribute.value_index)
	            && result.pricing
	            && result.pricing[attr.attribute_code]) {

	            attribute.is_percent    = result.pricing[attr.attribute_code].is_percent;
	            attribute.pricing_value = (result.pricing[attr.attribute_code].value == null ? '' : result.pricing[attr.attribute_code].value);
	        }
	    }.bind(this));

	    this.attributes.each(function(attribute) {
	        if ($('simple_product_' + attribute.attribute_code)) {
	            $('simple_product_' + attribute.attribute_code).value = '';
	        }
	    }.bind(this));

	    this.links.set(result.product_id, result.attributes);
	    this.updateGrid();
	    this.updateValues();
	    this.grid.reload();
	},
	checkCreationUniqueAttributes: function () {
	    var attributes = [];
	    this.attributes.each(function(attribute) {
	        attributes.push({
	            attribute_id:attribute.attribute_id,
	            value_index: $('simple_product_' + attribute.attribute_code).value
	        });
	    }.bind(this));

	    return this.checkAttributes(attributes);
	},
	getAttributeByCode: function (attributeCode) {
	    var attribute = null;
	    this.attributes.each(function(item){
	        if (item.attribute_code == attributeCode) {
	            attribute = item;
	            throw $break;
	        }
	    });
	    return attribute;
	},
	getAttributeById: function (attributeId) {
	    var attribute = null;
	    this.attributes.each(function(item){
	        if (item.attribute_id == attributeId) {
	            attribute = item;
	            throw $break;
	        }
	    });
	    return attribute;
	},
	getValueByIndex: function (attribute, valueIndex) {
	    var result = null;
	    attribute.values.each(function(value){
	       if (value.value_index == valueIndex) {
	           result = value;
	           throw $break;
	       }
	    });
	    return result;
	},
	showPricing: function (select, attributeCode) {
        var attribute = this.getAttributeByCode(attributeCode);
        if (!attribute) {
            return;
        }

        select = $(select);
        if (select.value && !$('simple_product_' + attributeCode + '_pricing_container')) {
            Element.insert(select, {after: '<div class="left"></div> <div id="simple_product_' + attributeCode + '_pricing_container" class="left"></div>'});
            var newContainer = select.next('div');
            select.parentNode.removeChild(select);
            newContainer.appendChild(select);
            // Fix visualization bug
            $(this.idPrefix + 'simple_form').down('.form-list').style.width = '100%';
        }

        var container = $('simple_product_' + attributeCode + '_pricing_container');

        if (select.value) {
            var value = this.getValueByIndex(attribute,select.value);
            if (!value) {
                if (!container.down('.attribute-price')) {
                    if (value == null) {
                        value = {};
                    }
                    container.update(this.pricingValueTemplate.evaluate(value));
                    var priceValueField = container.down('.attribute-price');
                    var priceTypeField = container.down('.attribute-price-type');

                    priceValueField.attributeCode = attributeCode;
                    priceValueField.priceField = priceValueField;
                    priceValueField.typeField = priceTypeField;

                    priceTypeField.attributeCode = attributeCode;
                    priceTypeField.priceField = priceValueField;
                    priceTypeField.typeField = priceTypeField;

                    Event.observe(priceValueField, 'change', this.updateSimplePricing.bindAsEventListener(this));
                    Event.observe(priceValueField, 'keyup', this.updateSimplePricing.bindAsEventListener(this));
                    Event.observe(priceTypeField, 'change',  this.updateSimplePricing.bindAsEventListener(this));

                    $('simple_product_' + attributeCode + '_pricing_value').value = null;
                    $('simple_product_' + attributeCode + '_pricing_type').value = null;
                }
            } else if (!isNaN(parseFloat(value.pricing_value))) {
                container.update(this.pricingValueViewTemplate.evaluate({
                    'value': (parseFloat(value.pricing_value) > 0 ? '+' : '') + parseFloat(value.pricing_value)
                             + ( parseInt(value.is_percent) > 0 ? '%' : '')
                }));
                $('simple_product_' + attributeCode + '_pricing_value').value = value.pricing_value;
                $('simple_product_' + attributeCode + '_pricing_type').value = value.is_percent;
            } else {
                container.update('');
                $('simple_product_' + attributeCode + '_pricing_value').value = null;
                $('simple_product_' + attributeCode + '_pricing_type').value = null;
            }
        } else if(container) {
            container.update('');
            $('simple_product_' + attributeCode + '_pricing_value').value = null;
            $('simple_product_' + attributeCode + '_pricing_type').value = null;
        }
	},
	updateSimplePricing: function(evt) {
        var element = Event.element(evt);
        if (!element.priceField.value.blank()) {
            $('simple_product_' + element.attributeCode + '_pricing_value').value = element.priceField.value;
            $('simple_product_' + element.attributeCode + '_pricing_type').value = element.typeField.value;
        } else {
            $('simple_product_' + element.attributeCode + '_pricing_value').value = null;
            $('simple_product_' + element.attributeCode + '_pricing_type').value = null;
        }
	},
	updateSimpleForm: function() {
	    this.attributes.each(function(attribute) {
	        if ($('simple_product_' + attribute.attribute_code)) {
	            this.showPricing($('simple_product_' + attribute.attribute_code), attribute.attribute_code);
	        }
	    }.bind(this));
	}
}

var onInitDisableFieldsList = [];

function toogleFieldEditMode(toogleIdentifier, fieldContainer) {
   if($(toogleIdentifier).checked) {
       enableFieldEditMode(fieldContainer);
   } else {
       disableFieldEditMode(fieldContainer);
   }
}

function disableFieldEditMode(fieldContainer) {
    $(fieldContainer).disabled = true;
    if($(fieldContainer + '_hidden')) {
        $(fieldContainer + '_hidden').disabled = true;
    }
}

function enableFieldEditMode(fieldContainer) {
    $(fieldContainer).disabled = false;
    if($(fieldContainer + '_hidden')) {
        $(fieldContainer + '_hidden').disabled = false;
    }
}

function initDisableFields(fieldContainer)
{
    onInitDisableFieldsList.push(fieldContainer);
}

function onCompleteDisableInited()
{
    onInitDisableFieldsList.each(function(item){
        disableFieldEditMode(item);
    });
}

Event.observe(window, 'load', onCompleteDisableInited);
